package huanzhao.erp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import huanzhao.erp.domain.entity.Task;
import huanzhao.erp.domain.types.TaskState;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface TaskMapper extends BaseMapper<Task> {
    /**
     * 获取员工正在进行的任务数量
     *
     * @param staffId 员工id
     * @return int
     * 2024/6/12 下午5:50:54
     */
    int getStaffRunningTasksNum(@Param("staffId") Long staffId);

    /**
     * 根据任务类型获取员工正在进行的任务数量
     *
     * @param staffId  员工id
     * @param taskType 任务类型
     * @return int
     * 2024/6/18 下午9:36:12
     */
    int getStaffRunningTasksNumByType(@Param("staffId") Long staffId, @Param("taskType") String taskType);

    /**
     * 按条件查询任务
     *
     * @param type  任务类型：质检、维修
     * @param state 任务状态
     * @return List<Task>
     * 2024/6/13 上午11:38:26
     */
    IPage<Task> getTasksByCondition(@Param("type") String type, @Param("state") String state, IPage<?> page);

    /**
     * 按条件查询员工的任务
     *
     * @param staffId 员工id
     * @param teamId  团队id
     * @param type    任务类型
     * @param state   任务状态
     * @return List<Task>
     * 2024/6/13 下午5:18:29
     */
    IPage<Task> getStaffTasksByCondition(@Param("staffId") Long staffId, @Param("teamId") Long teamId, @Param("type") String type, @Param("state") String state, IPage<?> page);

    /**
     * 查询手机的流转记录
     *
     * @param phoneId 手机id
     * @return List<Task>
     * 2024/6/18 下午4:54:02
     */
    List<Task> getPhoneLogs(@Param("phoneId") Long phoneId);

    /**
     * 获取团队中正在进行的任务数量
     *
     * @param teamId 团队id
     * @return int
     * 2024/6/20 下午5:13:24
     */
    int getTeamRunningTaskNum(@Param("teamId") Long teamId);

    /**
     * 判断任务是否正在进行
     *
     * @param taskId 任务id
     * @return void
     * 2024/6/20 下午8:07:14
     */
    boolean checkTaskIsRunning(@Param("taskId") Long taskId);

    /**
     * 按时间范围获取员工正在进行中的任务
     *
     * @param staffId        员工id
     * @param startTimestamp 开始时间
     * @param endTimestamp   结束时间
     * @return List<Task>
     * 2024/7/20 上午11:28:49
     */
    List<Task> getStaffRunningTasksInRange(@Param("staffId") Long staffId, @Param("startTimestamp") Long startTimestamp, @Param("endTimestamp") Long endTimestamp);

    /**
     * 按时间范围获取员工收到的所有任务
     *
     * @param staffId        员工id
     * @param startTimestamp 开始时间
     * @param endTimestamp   结束时间
     * @return List<Task>
     * 2024/7/20 上午11:33:24
     */
    List<Task> getStaffTasksInRange(@Param("staffId") Long staffId, @Param("startTimestamp") Long startTimestamp, @Param("endTimestamp") Long endTimestamp);

    /**
     * 按时间范围获取员工完成的任务
     *
     * @param staffId        员工id
     * @param startTimestamp 开始时间
     * @param endTimestamp   结束时间
     * @return List<Task>
     * 2024/7/20 上午11:37:42
     */
    List<Task> getStaffFinishedTasksInRange(@Param("staffId") Long staffId, @Param("startTimestamp") Long startTimestamp, @Param("endTimestamp") Long endTimestamp);

    /**
     * 更新任务状态
     *
     * @param taskId 任务id
     * @param state  状态
     * @return void
     * 2024/6/13 下午8:40:13
     */
    void updateTaskState(@Param("taskId") Long taskId, @Param("state") String state);

    TaskState getStateById(@Param("taskId") Long taskId);

    /**
     * 获取限时的未超时的待接收任务
     *
     * @return List<Task>
     * 2024/10/3 16:45:33
     */
    List<Task> getUnreceivedLimitedTasks();

    /**
     * 设置任务超时
     *
     * @param taskId 任务id
     *               2024/10/4 11:15:41
     */
    void setTaskTimeout(@Param("taskId") Long taskId);

    Long getReceiverIdById(@Param("taskId") Long taskId);

    /**
     * 完成任务
     *
     * @param taskId  任务id
     * @param comment 任务备注
     *                2024/10/8 21:41:02
     */
    void finishTask(@Param("taskId") Long taskId, @Param("comment") String comment);

    /**
     * 拒绝任务
     * 一般用于当前员工主动拒绝任务
     *
     * @param taskId  任务id
     * @param comment 拒绝理由
     *                2024/10/8 22:56:43
     */
    void rejectTask(@Param("taskId") long taskId, @Param("comment") String comment);

    /**
     * 将任务设置为被拒绝
     *
     * @param taskId 任务id
     *               2024/10/8 22:57:19
     */
    void setReject(@Param("taskId") long taskId);

    /**
     * 添加状态为移交中的任务
     * 2024/10/9 20:21:45
     */
    void insertTransferringTask(Task task);

    Task getReceiverIdAndRejectAndStateById(@Param("taskId") Long taskId);

    void setTaskComplete(@Param("taskId") long taskId);

    boolean existsById(@Param("taskId") Long taskId);
}




